import asyncio
import time

# 异步函数 async
# async def func():
#     print("你好呀")
#
# if __name__ == '__main__':
#     f = func()  # 此时的函数是异步协程函数
#     # print(f)  # 此时函数执行得到的是一个协程对象
#     asyncio.run(f)  # 协程程序运行需要asyncio 模块的支持



# async def func1():
#     print("我是func1")
#     # time.sleep(3)  # 当程序出现了同步操作的时候, 异步就中断了
#     await asyncio.sleep(3)  # 异步操作的代码
#     print("我是func1")
#
#
# async def func2():
#     print("我是func2")
#     # time.sleep(2)
#     await asyncio.sleep(2)  # 异步操作的代码
#     print("我是func2")
#
#
# async def func3():
#     print("我是func3")
#     # time.sleep(4)
#     await asyncio.sleep(4)  # 异步操作的代码
#     print("我是func3")


# if __name__ == '__main__':
#     tasks = [func1(), func2(), func3()]
#     t1 = time.time()
#     # 一次性启动多个任务 (协程)
#     asyncio.run(asyncio.wait(tasks))
#     t2 = time.time()
#     print(t2 - t1)



# # 协程多种写法
# async def func1():
#     print("我是func1")
#     # time.sleep(3)  # 当程序出现了同步操作的时候, 异步就中断了
#     await asyncio.sleep(3)  # 异步操作的代码
#     print("我是func1")
#
#
# async def func2():
#     print("我是func2")
#     # time.sleep(2)
#     await asyncio.sleep(2)  # 异步操作的代码
#     print("我是func2")
#
#
# async def func3():
#     print("我是func3")
#     # time.sleep(4)
#     await asyncio.sleep(4)  # 异步操作的代码
#     print("我是func3")
#
# async def main():
#     # 第一种写法
#     # f1 = func1()
#     # await f1  # 一般await 挂起操作放在协程对象前面 且 不能放在主程序里
#
#     # 第二种写法 (推荐)
#     tasks = [func1(), func2(), func3()]
#     await asyncio.wait(tasks)
#
#
# if __name__ == '__main__':
#     t1 = time.time()
#     asyncio.run(main())
#     t2 = time.time()
#     print(t2 - t1)




# 爬虫领域的应用

# 访问网页获取数据函数
async def download(url):
    print("准备下载", url)
    await asyncio.sleep(3)  # 模拟网络请求
    print("下载完毕", url)

# 结合协程函数
async def main():
    urls = [
        "http://www.baidu.com",
        "http://www.bilibili.com",
        "http://www.163.com"
    ]

    tasks = []
    for url in urls:
        d = download(url)
        tasks.append(d)

    await asyncio.wait(tasks)


if __name__ == '__main__':
    # 执行协程操作
    asyncio.run(main())

